#include <functional>

// 对包装器命名 因为命令都是无参 无返回值的函数
using work_t = function<void()>;

void Worker()
{
    // read->0
    sleep(10); // 方便调试
}

int InitProcessPool(const int &procesnum, vector<Channel> &channels, work_t work)
{
    //...
    if (id == 0)
    {
        ::close(pipefd[1]); // 子进程关闭写
        // child
        // 重定向
        dup2(pipefd[0], 0);
        work(); // 调用对应方法
        exit(0);
    }
    //...
}

void DebugPrint(const vector<Channel> &channels)
{
    for (const auto &c : channels)
    {
        cout << c.Name() << endl;
    }
}

int main(int argc, char *argv[])
{
    //...
    InitProcessPool(num, channels, Worker);

    DebugPrint(channels);

    sleep(100);
}

void CleanProcessPool()
{
    // version 3
    for (auto &c : channels) // 依旧正序遍历
    {
        c.Close();
        pid_t rid = ::waitpid(c.Id(), nullptr, 0); // 阻塞了
        // 等待成功返回子进程pid
        if (rid > 0)
        {
            cout << "child:" << rid << " wait ... success" << endl;
        }
    }
}

int InitProcessPool()
{
    for (int i = 0; i < procesnum; ++i)
    {
        // ...

        if (id == 0)
        {
            for (auto &c : channels)
            {
                c.Close();
            }
            ::close(pipefd[1]); // 子进程关闭写
            // child
            // 重定向之前先看对应读端的文件描述符
            cout << "debug:" << pipefd[0] << endl;
            // 重定向
            dup2(pipefd[0], 0);
            work(); // 调用对应方法
            exit(0);
        }

        // ...
    }
}
if (id == 0)
{
    // 关闭历史的wfd
    cout << getpid() << ", child close history fd: ";
    for (auto &c : channels)
    {
        cout << c._wFd() << " ";
        c.Close();
    }
    cout << " over" << endl;
    ::close(pipefd[1]); // 子进程关闭写
    // child
    // 重定向之前先看对应读端的文件描述符
    cout << "debug:" << pipefd[0] << endl;
    // 重定向
    dup2(pipefd[0], 0);
    work(); // 调用对应方法
    exit(0);
}
